#pragma once
#include <iostream>

class Util
{
public:
    //读取文档内容
    static bool ReadFile(const std::string file_path, std::string *content)
    {
        //以读方式打开文档
        std::ifstream in(file_path, std::ios::in);
        //是否打开
        if(!in.is_open())
        {
            std::cerr << "open file "<< file_path << "error!" << std::endl;
            return false;
        }
        //循环读取每一行数据
        std::string line;
        while(std::getline(in, line))
        {
            *content += line;
        }   

        //关闭文件
        in.close();
        return true;
    }

    //获取文档标题
    static bool ParseTitle(const std::string &file_content, std::string *title)
    {
        //找到<title>标签
        size_t left = file_content.find("<title>");
        if(left == std::string::npos)
        {
            return false;
        }
        //确定标题开始位置
        left += std::string("<title>").size();

        //从left位置开始找到</title>标签
        size_t right = file_content.find("</title>", left);
        if(right == std::string::npos)
        {
            return false;
        }
        //如果起始位置大于结束位置就有问题了
        if(left > right)
        {
            return false;
        }

        //截取标题
        *title = file_content.substr(left, right - left);
        return true;
    }

    //获取文档内容
    static bool ParseContent(const std::string &file_content, std::string *content)
    {
        //状态机
        enum Status
        {
            LABLE,  //标签
            CONTENT //文本
        };
        //初始状态设置为标签状态
        enum Status status = LABLE; 
        //遍历每一个字符提取出来去标签的文本
        for(char ch : file_content)
        {
            switch(status)
            {
                case LABLE:
                    //如果ch是右标签的话，那么就代表下一个字符是文本了，所以要改变状态
                    if(ch == '>')
                    {
                        status = CONTENT;
                    }
                    break;
                case CONTENT:
                    //如果ch是左括号的话，就代表文本区域结束了，要改变状态了
                    if(ch == '<')
                    {
                        status = LABLE;
                    }
                    else
                    {
                        //如果是\n的话，将该字符转化为空字符，防止污染去标签操作后的文档之前的分隔符
                        if(ch == '\n')
                        {
                            ch = ' ';
                        }
                        //将字符插入
                        content->push_back(ch);
                    }
                    break;
                default:
                    break;
            }
        }
        return true;
    }

    //构建文档url
    static bool ParseUrl(const std::string &file_path, std::string *url, const std::string &src_path)
    {
        std::string head = "www.boost.org/doc/libs/1_87_0/doc/html/";
        std::string tail = file_path.substr(src_path.size());
        //拼接url字符串
        *url = head + tail;
        return true;
    }
};